package com.li.proxy.jdk;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 专门负责计时的调用处理器
 * 在这个调用处理器中编写计时相关的代码
 * 这个调用处理器只需要写一个就行了
 */
public class TimerInvocationHandler implements InvocationHandler {

    private Object target;


    public TimerInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * 这个接口就是为了让你有地方写增强代码
     *  invoke方法的三个参数：invoke方法是JDK负责调用，所以JDK调用这个方法的时候会自动给我们传过来这三个参数
     *  1. Object proxy: 代理对象的引用
     *  2. Method method: 目标对象上的目标方法（要执行的目标的方法就是它）
     *  3. Object[] args: 目标方法上的实参
     *
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long begin = System.currentTimeMillis();


        //调用目标对象上的目标方法
        //方法四要素：哪个对象，哪个方法，传什么参数，返回什么值
        Object object = method.invoke(target, args);

        long end = System.currentTimeMillis();
        System.out.println("耗时: "+ (end - begin) + "毫秒");

        //注意这个invoke方法的返回值，如果代理对象调用代理方法之后需要返回结果的话，invoke方法必须将目标对象目标方法的执行结果继续返回
        return object;
    }
}
